iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 20
0
自我挑戰組

30 天的 ShellScript 教室解決開發者的困擾系列 第 20

[鐵人賽第20天] 實戰:退不出去的硬碟

  • 分享至 

  • xImage
  •  

前面講這麼多東西,也該來做點事情了。

umount Data0/
umount: /media/Data0: target is busy
        (In some cases useful info about processes that
         use the device is found by lsof(8) or fuser(1).)

這個訊息應該夠令人火大了吧,我就想閃人了結果硬碟退不掉。大部分的人應該會直接照他的建議執行下面的指令:

lsof

接著他應該會決得很幹,沒錯因為有一大票的錯誤訊息,大概捲了數十秒後,內心會想:我下這個指令幹麻,還浪費我三秒鐘看一大堆訊息從前面閃過。

是的,直接把所有開啟中的檔案叫出來真的沒啥意義,不過還記得我們講過 stdout 與 grep 吧?

lsof | grep Data0
smbd      114212               root  cwd       DIR               8,17     4096          2 /media/Data0
smbd      114212               root   38r      DIR               8,17     4096          2 /media/Data0

很好哪個網路芳鄰使用者正在看我的檔案,拖出去斬了!!

但是如果 Process 很多,手動砍又有點不切實際,所以這時候我們可以先用 sed 指令把多個空白全部換成一個空白,像這樣:

lsof | grep Data0 | sed "s/\ \ */\ /g"
smbd 114212 root cwd DIR 8,17 4096 2 /media/Data0
smbd 114212 root 38r DIR 8,17 4096 2 /media/Data0

恩,這資料看起來有點邏輯了,用空白分隔,第一欄是程序名稱,第二欄是 pid ,那接著取出 pid 吧,有個好用的指令叫做 cut ,用法如下:

cut -d '分隔字元' -f 第幾欄

再把上面的指令接起來:

lsof | grep Data0 | sed "s/\ \ */\ /g" | cut -d ' ' -f 2
114212
114212

最後再用 for 迴圈把整個包起來:

for pid in `lsof | grep Data0 | sed "s/\ \ */\ /g" | cut -d ' ' -f 2`; do
    kill $pid
done

搞定收工。蛤你說搞不定?

for pid in `lsof | grep Data0 | sed "s/\ \ */\ /g" | cut -d ' ' -f 2`; do
    kill -9 $pid
done

我是誰?
我是 dd-han ,可以叫我呆翰,是國立臺中科技大學的延畢生 與 創科資訊的時習生。


上一篇
[鐵人賽第19天] Shell 裡面的 args -$0 $1 $* $@
下一篇
[鐵人賽第21天] 實戰:快速建立開發環境
系列文
30 天的 ShellScript 教室解決開發者的困擾23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言